using System;
using System.Collections.Generic;
using System.Windows.Forms;
using App.Modelo;
using App.Controlador;

namespace App.Seguridad.Vista.Controls
{
    public partial class PerfilesControl : UserControl
    {

        private int RowHeight = 24;

        private Dictionary<CheckBox, PerfilesEventArgs> matriz;
        private Dictionary<PerfilesEventArgs, bool> changes;

        public event PerfilesEventHandler PerfilChanged;

        private List<CheckBox> checkboxes = new List<CheckBox>();


        private IList<Funcion> _funciones;
        private IList<Formulario> _formularios;
        private IList<Perfil> _perfiles;

        public IList<Perfil> Perfiles
        {
            get { return _perfiles; }
            set { 
                _perfiles = null;

                foreach (CheckBox chk in matriz.Keys)
                {
                    chk.Checked=false;

                    foreach (Perfil p in value)
                    {
                        if (matriz[chk].comparar(p))
                        {
                            chk.Checked = true;
                            break;
                        }
                    }
                }
                changes = new Dictionary<PerfilesEventArgs, bool>();
                _perfiles = value;
            }
        }

        public PerfilesControl()
        {
            InitializeComponent();
            matriz = new Dictionary<CheckBox, PerfilesEventArgs>();
            
        }
        
        
    
        public void init ()
        {

            var cGrupos = ModuloSeguridad.Instance.FabricaControladoras.Factory<ControladoraGrupos>();

            _formularios = cGrupos.ListFormularios();
            _funciones = cGrupos.ListFunciones();

            table.RowCount = _formularios.Count +1;
            table.ColumnCount = _funciones.Count+1;

            table.RowStyles.Clear();
            table.ColumnStyles.Clear();

            table.Height = (table.RowCount * this.RowHeight);
            

            for (int i = 0; i < _funciones.Count; i++)
            {
                
                Label lbl = new Label()
                {
                    Text = _funciones[i].Nombre
                };
                table.Controls.Add(lbl, i + 1, 0);
            }


            for (int j = 0; j < _formularios.Count; j++)
            {
                Label lblForm = new Label();
                lblForm.Text = _formularios[j].Descripcion;

                table.Controls.Add(lblForm, 0, j+1);

              

                for (int i = 0; i < _funciones.Count; i++)
                {
                    CheckBox chk = new CheckBox();
                    chk.Tag = _formularios[j].Nombre + "/" + _funciones[i].Nombre;

                    matriz.Add(chk, new PerfilesEventArgs(_formularios[j], _funciones[i]));
                    
                    chk.CheckedChanged += new System.EventHandler(this.checkBox_CheckedChanged);
                    
                    table.Controls.Add(chk, i+1, j+1);

                    checkboxes.Add(chk);
                }
            }


        }

        private void checkBox_CheckedChanged(object sender, EventArgs e)
        {
            CheckBox chk = (CheckBox)sender;

            if ( changes != null )
                changes[matriz[chk]] = chk.Checked;

            if (_perfiles  != null && PerfilChanged != null)
            {

                PerfilChanged(this, matriz[chk], chk.Checked);
            }
        }

        /** 
         * Retorna una lista de strings representando el perfil seleccionado
         */
        public string[] GetCanonicalChanges()
        {
            List<string> ret = new List<string>();
            foreach( var c in checkboxes)
                if( c.Checked )
                    ret.Add(c.Tag.ToString());
            return ret.ToArray();
        }

        public Dictionary<Perfil, bool> getChanges( Grupo grupo )
        {
            
            Dictionary<Perfil, bool> ret = new Dictionary<Perfil,bool>();

            foreach (PerfilesEventArgs h in changes.Keys)
            {
                Perfil original = null;

                foreach (Perfil p in _perfiles)
                {
                    if (h.comparar(p))
                    {
                        original = p;
                        break;
                    }
                }

                if (original != null && !changes[h])
                {
                    ret[original] = false;
                }
                else if( original == null && changes[h] )
                {
                    Perfil nuevo = new Perfil();
                    nuevo.Grupo = grupo;
                    nuevo.Formulario = h.Formulario;
                    nuevo.Funcion = h.Funcion;
                    
                    ret[nuevo] = true;
                }

                

            }
            return ret;


        }


        private void panel1_Paint(object sender, PaintEventArgs e)
        {

        }



        public void CheckAll()
        {
            foreach (var check in checkboxes)
                check.Checked = true;
        }
    }
}
